const cron = require('node-cron');
const OrderGenerator = require('./orderGenerator');
const logger = require('../utils/logger');

class Scheduler {
  constructor() {
    this.orderGenerator = new OrderGenerator();
    this.tasks = new Map()
  }

  // 启动定时任务
  start() {
    logger.info('启动订单生成调度器...');

    // 每分钟检查一次是否需要生成订单
    const task = cron.schedule('* * * * *', async () => {
      try {
        await this.orderGenerator.generateOrders();
      } catch (error) {
        logger.error('定时任务执行失败:', error);
      }
    }, {
      scheduled: false
    });

    this.tasks.set('orderGeneration', task);
    task.start();

    logger.info('订单生成调度器已启动，每分钟检查一次');

    // 每5分钟重新加载配置
    const configReloadTask = cron.schedule('*/5 * * * *', async () => {
      try {
        logger.info('重新加载配置...');
        await this.orderGenerator.initialize();
        logger.info('配置重新加载完成');
      } catch (error) {
        logger.error('重新加载配置失败:', error);
      }
    }, {
      scheduled: false
    });

    this.tasks.set('configReload', configReloadTask);
    configReloadTask.start();

    logger.info('配置重新加载任务已启动，每小时执行一次');
  }

  // 停止定时任务
  stop() {
    logger.info('停止订单生成调度器...');

    this.tasks.forEach((task, name) => {
      task.stop();
      logger.info(`已停止任务: ${name}`);
    });

    this.tasks.clear();
    logger.info('所有定时任务已停止');
  }

  // 手动触发订单生成
  async triggerOrderGeneration() {
    try {
      logger.info('手动触发订单生成...');
      await this.orderGenerator.generateOrders();
      logger.info('手动订单生成完成');
    } catch (error) {
      logger.error('手动订单生成失败:', error);
      throw error;
    }
  }

  // 手动触发配置重新加载
  async triggerConfigReload() {
    try {
      logger.info('手动触发配置重新加载...');
      await this.orderGenerator.initialize();
      logger.info('手动配置重新加载完成');
    } catch (error) {
      logger.error('手动配置重新加载失败:', error);
      throw error;
    }
  }

  // 获取任务状态
  getTaskStatus() {
    const status = {};
    this.tasks.forEach((task, name) => {
      status[name] = {
        running: task.running,
        scheduled: task.scheduled
      };
    });
    return status;
  }
}

module.exports = Scheduler;
